package org.dxy.domain.model.aggregate;

import org.dxy.domain.command.productionLine.*;
import org.dxy.domain.event.productionLine.*;
import org.dxy.domain.model.aggregate.impl.ProductionLineAggRoot;

/**
 * @description: 产线聚合根接口
 * @author: dxy
 * @createTime: 2025/6/19 22:24
 */
public interface ProductionLine  extends AggregateRoot {

    // === 静态工厂方法 ===

    /**
     * 创建产线
     *
     * @param command          创建产线命令
     * @param productionLineId 产线ID
     * @return 产线聚合根实例
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    static ProductionLine create(CreateProductionLineCommand command, Long productionLineId) {
        return ProductionLineAggRoot.create(command, productionLineId);
    }

    // === 业务方法 ===
    /**
     * 启动产线
     * @param command 启动产线命令
     * @return 产线启动事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProductionLineStartedEvent start(StartProductionLineCommand command);

    /**
     * 暂停产线
     * @param command 暂停产线命令
     * @return 产线暂停事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProductionLinePausedEvent pause(PauseProductionLineCommand command);

    /**
     * 恢复产线
     * @param command 恢复产线命令
     * @return 产线恢复事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProductionLineResumedEvent resume(ResumeProductionLineCommand command);

    /**
     * 停止产线
     * @param command 停止产线命令
     * @return 产线停止事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProductionLineStoppedEvent stop(StopProductionLineCommand command);

    /**
     * 移除产线
     * @param command 移除产线命令
     * @return 产线移除事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProductionLineRemovedEvent remove(RemoveProductionLineCommand command);

    /**
     * 添加工位到产线
     * @param command 添加工位命令
     * @param workstation 工位对象
     * @return 工位添加到产线事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationAddedToLineEvent addWorkstation(AddWorkstationToLineCommand command, Workstation workstation);

    /**
     * 从产线移除工位
     * @param command 移除工位命令
     * @param workstation 工位对象
     * @return 工位从产线移除事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkstationRemovedFromLineEvent removeWorkstation(RemoveWorkstationFromLineCommand command, Workstation workstation);

    /**
     * 重新配置产线
     * @param command 重新配置命令
     * @return 产线重新配置事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProductionLineReconfiguredEvent reconfigure(ReconfigureProductionLineCommand command);

    /**
     * 分配工单到产线
     * @param command 分配工单命令
     * @param workOrder 工单对象
     * @return 工单分配到产线事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkOrderAssignedToLineEvent assignWorkOrder(AssignWorkOrderToLineCommand command, WorkOrder workOrder);

    /**
     * 从产线移除工单
     * @param command 移除工单命令
     * @param workOrder 工单对象
     * @return 工单从产线移除事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    WorkOrderRemovedFromLineEvent removeWorkOrder(RemoveWorkOrderFromLineCommand command, WorkOrder workOrder);

    /**
     * 更新产线产能
     * @param command 更新产能命令
     * @return 产线产能更新事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProductionLineCapacityUpdatedEvent updateCapacity(UpdateProductionLineCapacityCommand command);

    /**
     * 报告产线报警
     * @param command 报告报警命令
     * @return 产线报警触发事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProductionLineAlarmTriggeredEvent reportAlarm(ReportProductionLineAlarmCommand command);

    /**
     * 报告产线故障
     * @param command 报告故障命令
     * @return 产线故障报告事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProductionLineFaultReportedEvent reportFault(ReportProductionLineFaultCommand command);

    /**
     * 恢复产线
     * @param command 恢复产线命令
     * @return 产线恢复事件
     * @date: 2025/6/22 17:34
     * @auther dxy
     */
    ProductionLineRecoveredEvent recover(RecoverProductionLineCommand command);
}
